
namespace cframework_coroutineutil
{
    using System.Collections;
    using UnityEngine;

    public static class CoroutineUtil
    {
        public static Coroutine StartCoroutine(this IEnumerator e)
        {
            return e.StartCoroutine(CoroutineHelper.instance);
        }

        public static Coroutine StartCoroutine(this IEnumerator e, MonoBehaviour b)
        {
            return b.StartCoroutine(e);
        }

        public static IEnumerator WithResult(this IEnumerator co)
        {
            bool first = true;
            while (co.Current == null || co.Current is IEnumerator || co.Current is YieldInstruction)
            {
                if (!first)
                {
                    yield return co.Current;
                }

                first = false;

                if (!co.MoveNext())
                {
                    yield break;
                }
            }

            yield return co.Current;
        }

        //public class AndOrResult
        //{
        //    public bool[] finished;
        //    public object[] results;

        //    public AndOrResult(int num)
        //    {
        //        finished = new bool[num];
        //        results = new object[num];
        //    }
        //}

        //public static IEnumerator Or(this IEnumerator co, IEnumerator co2)
        //{
        //    AndOrResult result = new AndOrResult(2);
        //    while (true)
        //    { 
        //        if(!co.MoveNext())
        //        {
        //            result.finished[0] = true;
        //            result.results[0] = co.Current;
        //            yield return result;
        //            yield break;
        //        }

        //        if(!co2.MoveNext())
        //        {
        //            result.finished[1] = true;
        //            result.results[1] = co2.Current;
        //            yield return result;
        //            yield break;
        //        }

        //        yield return null;
        //    }
        //}

        //public static IEnumerator And(this IEnumerator co, IEnumerator co2)
        //{
        //    int finishNum = 0;
        //    AndOrResult result = new AndOrResult(2);
        //    while (true)
        //    {
        //        if (!result.finished[0])
        //        {
        //            if (!co.MoveNext())
        //            {
        //                finishNum++;
        //                result.finished[0] = true;
        //                result.results[0] = co.Current;
        //            }
        //        }

        //        if (!result.finished[1])
        //        { 
        //            if (!co2.MoveNext())
        //            {
        //                finishNum++;
        //                result.finished[1] = true;
        //                result.results[1] = co2.Current;
        //            }
        //        }

        //        if(finishNum >= 2)
        //        {
        //            yield return result;
        //            yield break;
        //        }

        //        yield return null;
        //    }
        //}
    }
}